/* ===========================================================
 * JFreeChart : a free chart library for the Java(tm) platform
 * ===========================================================
 *
 * (C) Copyright 2000-2011, by Object Refinery Limited and Contributors.
 *
 * Project Info:  http://www.jfree.org/jfreechart/index.html
 *
 * This library is free software; you can redistribute it and/or modify it 
 * under the terms of the GNU Lesser General Public License as published by 
 * the Free Software Foundation; either version 2.1 of the License, or 
 * (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful, but 
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 
 * License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 
 * USA.  
 *
 * [Oracle and Java are registered trademarks of Oracle and/or its affiliates. 
 * Other names may be trademarks of their respective owners.]
 *
 * ---------------------
 * SWTTimeSeriesDemo.java
 * ---------------------
 * (C) Copyright 2006-2009, by Object Refinery Limited and Contributors.
 *
 * Original Author:  David Gilbert (for Object Refinery Limited);
 * Contributor(s):   Henry Proudhon (henry.proudhon AT ensmp.fr);
 *
 * Changes
 * -------
 * 30-Jan-2007 : New class derived from TimeSeriesDemo.java (HP);
 * 
 */
package org.jfree.experimental.chart.swt.demo;

import java.awt.Color;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.time.Month;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.XYDataset;
import org.jfree.experimental.chart.swt.ChartComposite;
import org.jfree.ui.RectangleInsets;

/**
 * An example of a time series chart. For the most part, default settings are
 * used, except that the renderer is modified to show filled shapes (as well as
 * lines) at each data point.
 */
public class SWTTimeSeriesDemo {

	/**
	 * Creates a chart.
	 * 
	 * @param dataset
	 *            a dataset.
	 * 
	 * @return A chart.
	 */
	private static JFreeChart createChart(XYDataset dataset) {

		JFreeChart chart = ChartFactory.createTimeSeriesChart(
				"Legal & General Unit Trust Prices", // title
				"Date", // x-axis label
				"Price Per Unit", // y-axis label
				dataset, // data
				true, // create legend?
				true, // generate tooltips?
				false // generate URLs?
				);

		chart.setBackgroundPaint(Color.white);

		XYPlot plot = (XYPlot) chart.getPlot();
		plot.setBackgroundPaint(Color.lightGray);
		plot.setDomainGridlinePaint(Color.white);
		plot.setRangeGridlinePaint(Color.white);
		plot.setAxisOffset(new RectangleInsets(5.0, 5.0, 5.0, 5.0));
		plot.setDomainCrosshairVisible(true);
		plot.setRangeCrosshairVisible(true);

		XYItemRenderer r = plot.getRenderer();
		if (r instanceof XYLineAndShapeRenderer) {
			XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) r;
			renderer.setBaseShapesVisible(true);
			renderer.setBaseShapesFilled(true);
			renderer.setDrawSeriesLineAsPath(true);

		}

		NumberAxis range = (NumberAxis) plot.getRangeAxis();
		range.setRange(0.0, 10000000.0);

		DateAxis axis = (DateAxis) plot.getDomainAxis();
		axis.setDateFormatOverride(new SimpleDateFormat("MMM-yyyy"));
		axis.setAutoRange(true);

		return chart;

	}

	/**
	 * Creates a dataset, consisting of two series of monthly data.
	 * 
	 * @return The dataset.
	 */
	private static XYDataset createDataset() {

		// TimeSeries s1 = new TimeSeries("L&G European Index Trust");
		// s1.add(new Month(1, 2001), 171.8);
		// s1.add(new Month(2, 2001), 181.8);
		// s1.add(new Month(3, 2001), 167.3);
		// s1.add(new Month(4, 2001), 153.8);
		// s1.add(new Month(5, 2001), 167.6);
		// s1.add(new Month(6, 2001), 158.8);
		// s1.add(new Month(7, 2001), 148.3);
		// s1.add(new Month(8, 2001), 153.9);
		// s1.add(new Month(9, 2001), 142.7);
		// s1.add(new Month(10, 2001), 123.2);
		// s1.add(new Month(11, 2001), 131.8);
		// s1.add(new Month(12, 2001), 139.6);
		// s1.add(new Month(1, 2002), 142.9);
		// s1.add(new Month(2, 2002), 138.7);
		// s1.add(new Month(3, 2002), 137.3);
		// s1.add(new Month(4, 2002), 143.9);
		// s1.add(new Month(5, 2002), 139.8);
		// s1.add(new Month(6, 2002), 137.0);
		// s1.add(new Month(7, 2002), 132.8);
		//
		// TimeSeries s2 = new TimeSeries("L&G UK Index Trust");
		// s2.add(new Month(2, 2001), 129.6);
		// s2.add(new Month(3, 2001), 123.2);
		// s2.add(new Month(4, 2001), 117.2);
		// s2.add(new Month(5, 2001), 124.1);
		// s2.add(new Month(6, 2001), 122.6);
		// s2.add(new Month(7, 2001), 119.2);
		// s2.add(new Month(8, 2001), 116.5);
		// s2.add(new Month(9, 2001), 112.7);
		// s2.add(new Month(10, 2001), 101.5);
		// s2.add(new Month(11, 2001), 106.1);
		// s2.add(new Month(12, 2001), 110.3);
		// s2.add(new Month(1, 2002), 111.7);
		// s2.add(new Month(2, 2002), 111.0);
		// s2.add(new Month(3, 2002), 109.6);
		// s2.add(new Month(4, 2002), 113.2);
		// s2.add(new Month(5, 2002), 111.6);
		// s2.add(new Month(6, 2002), 108.8);
		// s2.add(new Month(7, 2002), 101.6);

		// TimeSeriesCollection dataset = new TimeSeriesCollection();
		// dataset.addSeries(s1);
		// dataset.addSeries(s2);

		SimpleDateFormat dateFormat = new SimpleDateFormat("MMMyy");

		String[] date = { "Jan14", "Feb14", "Mar14", "Apr14", "May14", "Jun14",
				"Jul14", "Aug14", "Sep14", "Oct14", "Nov14", "Dec14" };
		Number[] value = { 3000000, 3545000, 2105000, 1000000, 8000000,
				7000000, 9000000, 1300000, 6300000, 8300000, 7000000, 7500000 };

		LinkedList<Date> d = new LinkedList<Date>();
		LinkedList<Number> values = new LinkedList<Number>();

		for (int i = 0; i < value.length; i++) {
			Date refDate = null;
			try {
				refDate = dateFormat.parse(date[i]);
			} catch (ParseException e) {
				e.printStackTrace();
			}
			Number number = (Number) value[i];

			d.add(refDate);
			values.add(number);
		}

		TimeSeries s1 = new TimeSeries("Total Pengeluaran");

		for (int i = 0; i < d.size(); i++) {
			Date de = d.get(i);
			s1.add(new Month(de), values.get(i));
		}

		TimeSeriesCollection dataset = new TimeSeriesCollection();
		dataset.addSeries(s1);
		return dataset;
	}

	/**
	 * Starting point for the demonstration application.
	 * 
	 * @param args
	 *            ignored.
	 */
	public static void main(String[] args) {
		final JFreeChart chart = createChart(createDataset());
		final Display display = new Display();
		Shell shell = new Shell(display);
		shell.setSize(600, 300);
		shell.setLayout(new FillLayout());
		shell.setText("Time series demo for jfreechart running with SWT");
		ChartComposite frame = new ChartComposite(shell, SWT.NONE, chart, true);
		frame.setDisplayToolTips(true);
		frame.setHorizontalAxisTrace(false);
		frame.setVerticalAxisTrace(false);
		shell.open();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
	}

}
